package com.batata.continuing.web.demo;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.batata.continuing.config.moreNote.token.NotNeedToken;
//import com.batata.continuing.config.mq.mqtt.MqttConfig;
import com.batata.continuing.pojo.billing.BillInfo;
import com.batata.continuing.pojo.user.UserInfo;
import com.batata.continuing.service.billing.BillingService;
import com.batata.continuing.utils.RedisRowLockUtil;
import com.batata.continuing.utils.RedisUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;


@RestController
@AllArgsConstructor
@Api(tags = "测试使用")
@RequestMapping("/test")
public class TestController {


    private final BillingService billingService;


//    @Autowired
//    private MqttConfig mqttConfig;

    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private RedisRowLockUtil redisRowLockUtil;

    /**
     * 取yml中的内容
     */
//    @Value("${name}")
//    private String name;
    @NotNeedToken
    @ApiOperation("testData")
    @GetMapping("/testData")
    public String testData() {
        return "111";
    }


    @NotNeedToken
    @ApiOperation("testDelete")
    @GetMapping("/testDelete")
    public String testDeleta() {

//        QueryWrapper<BillInfo> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq("id", 19);
//
//        billingService.remove(queryWrapper);

        return "132132";
    }


//    @NotNeedToken
//    @ApiOperation("testMQTT")
//    @GetMapping("/testMQTT")
//    public String testMQTT() {
//        boolean publish = mqttConfig.publish("test", "消息体");
//        System.out.println("publish = " + publish);
//        return publish + "";
//    }

    @NotNeedToken
    @ApiOperation("testRedisLock")
    @GetMapping("/testRedisLock")
    public String testRedisLock() throws InterruptedException {
        String key = "testRedisLock";
        String value = "testRedisLockValue";
//        redisUtil.setIfAbsent(key, value);
//        Thread.sleep(10000);
//        redisUtil.releaseLock(key, value);

        redisRowLockUtil.getLockStatusAndSetLockStatus("testRedisLock", "row_id", value);
//        Thread.sleep(10000);
        redisRowLockUtil.releaseLockStatus("testRedisLock", "row_id", value);

        return "执行结束";
    }


    @NotNeedToken
    @ApiOperation("testError")
    @GetMapping("/testError")
    public void testError() {
//        if (1 == 1) {
//            throw new RuntimeException("异常");
//        }

//        List<String> a = new ArrayList<>();
//
//        int c = 0;
//        while (true) {
//            a.add("a");
//            c++;
//            System.out.println("添加了" + c + "条");
//            if (c > 10000000) {
//                System.out.println("结束测试");
//                break;
//            }
//        }
//        a.clear();


        List<UserInfo> userInfoList = new ArrayList<>();
        int e = 0;
        while (true) {
            UserInfo u = new UserInfo();
            u.setUserName(String.valueOf(e));
            userInfoList.add(u);
            e++;
            if (e > 10000000) {
                System.out.println("结束测试");
                break;
            }
        }


//        byte[] heapOom = new byte[1024 * 1024]; // 分配1MB的空间
//        int d = 0;
//        while (true) {
//            d++;
//            heapOom = new byte[1024 * 1024]; // 不断重复，直到内存耗尽
//            System.out.println(
//                    "第" + d + "次测试"
//            );
//
//            if (d > 10000000) {
//                System.out.println("结束测试");
//                break;
//            }
//        }

        // ThreadLocal 需要手动释放，否则可能发生内存泄漏
//        ThreadLocal threadLocal = new ThreadLocal();

    }


}
